home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Celestin Apprentice 5
/
Apprentice-Release5.iso
/
Environments
/
PowerMacOberon feb96
/
Source
/
Decoder.Mod
(
.txt
)
< prev
next >
Encoding:
Amiga
Atari
Commodore
DOS
FM Towns/JPY
Macintosh
Macintosh JP
Macintosh to JP
NeXTSTEP
RISC OS/Acorn
Shift JIS
UTF-8
Wrap
Oberon Text
|
1996-01-25
|
40.0 KB
|
1,115 lines
|
[
TEXT/.Ob4
]
Syntax12b.Scn.Fnt
Syntax12.Scn.Fnt
Syntax12i.Scn.Fnt
Syntax10.Scn.Fnt
Syntax14.Scn.Fnt
MODULE Decoder; (* mmb 25.12.90 / 31.5.94 *)(* MAH 25 Jul 94 Byte ordering changed *)
(* MK 24 0ct 95 extended reference information *)
IMPORT
Texts, Files, TextFrames, Viewers, MenuViewers, Oberon, SYSTEM, Out;
CONST
(* formats *)
LIxAAxLK = 0; BOxBIxBDxAAxLK = 1; BOxBIxLK = 2; LKu = 3; Rcu = 4; None = 6; BFxBFAxLKu = 7; BTxBAxBBxLKu = 8;
RTxDxRA = 9; RSxDxRA = 11; RSxRAxRBxRcu = 12; RTxRAxNBxRcu = 13; RSxRAxNBxRcu = 14;
RTxRAxUI = 15; RTxRAxSI = 16; RTxRAxRBxRc = 17; RTxRAxRBxRcu = 18; RTxRAxRc = 19; RTxRAxRcu = 20;
BFxRAxSI = 21; BFxRAxUI = 22; BFxRAxRBxRcu = 23; TOxRAxSI = 24; TOxRAxRBxRcu = 25; RAxRSxUI = 26;
RAxRSxRBxRc = 27; RAxRSxRc = 28; RAxRSxSHxMBxMExRc = 29; RAxRSxRBxMBxMExRc = 30; RAxRSxSHxRc = 31;
SPRxRSxRcu = 32; RTxSPRxRcu = 33; FXMxRSxRcu = 34; BFxRcu = 35; RTxRcu = 36; RSxRcu = 37; FRTxDxRA = 38;
FRTxRAxRBxRcu = 39; FRSxDxRA = 40; FRSxRAxRBxRcu = 41; FRTxFRBxRc = 42; FRTxFRAxFRBxRc = 43;
FRTxFRAxFRCxRc = 44; FRTxFRAxFRCxFRBxRc = 45; BFxFRAxFRBxRcu = 46; FRTxRc = 47; BFxBFAxRcu = 48;
FLMxFRBxRc = 49; BFxIxRc = 50; BTxRc = 51; RAxRBxRc = 52; RAxRBxRcu = 53; SRxRSxRcu = 54; RTxSRxRcu = 55;
RTxRA = 56; RTxSI = 57;
(* misc *)
tab = 9X;
Pointer = 13; ProcTyp = 14;
W: Texts.Writer;
curInstr, pc: LONGINT;
PROCEDURE ReadInt (VAR r: Files.Rider; VAR x: INTEGER);
VAR a: ARRAY 2 OF CHAR; i: INTEGER;
BEGIN
FOR i := 0 TO 1 DO Files.Read(r, a[i]) END;
x := SYSTEM.VAL(INTEGER, a);
END ReadInt;
PROCEDURE ReadLInt (VAR r: Files.Rider; VAR x: LONGINT);
VAR a: ARRAY 4 OF CHAR; i: INTEGER;
BEGIN
FOR i := 0 TO 3 DO Files.Read(r, a[i]) END;
x := SYSTEM.VAL(LONGINT, a);
END ReadLInt;
PROCEDURE Instr (mnemonic: ARRAY OF CHAR; fields: SHORTINT);
PROCEDURE WriteCB (i: LONGINT);
BEGIN
Texts.WriteString(W, "CF"); Texts.WriteInt(W, i DIV 4, 0);
CASE i MOD 4 OF
0: Texts.WriteString(W, ".LT")
| 1: Texts.WriteString(W, ".GT")
| 2: Texts.WriteString(W, ".EQ")
| 3: Texts.WriteString(W, ".SO")
END
END WriteCB;
PROCEDURE AA;
BEGIN IF 30 IN SYSTEM.VAL(SET, curInstr) THEN Texts.Write(W, "a") END
END AA;
PROCEDURE BA;
BEGIN WriteCB(curInstr DIV 65536 MOD 32)
END BA;
PROCEDURE BB;
BEGIN WriteCB(curInstr DIV 2048 MOD 32)
END BB;
PROCEDURE BD;
BEGIN Texts.WriteHex(W, ASH(SYSTEM.LSH(curInstr MOD 65536 DIV 4, 18), -16)+pc); Texts.Write(W, "H")
END BD;
PROCEDURE BF;
BEGIN Texts.WriteString(W, "CF"); Texts.WriteInt(W, curInstr DIV 8388608 MOD 8, 0)
END BF;
PROCEDURE BFA;
BEGIN Texts.WriteString(W, "CF"); Texts.WriteInt(W, curInstr DIV 262144 MOD 8, 0)
END BFA;
PROCEDURE BI;
BEGIN WriteCB(curInstr DIV 65536 MOD 32)
END BI;
PROCEDURE BO;
BEGIN
CASE curInstr DIV 2097152 MOD 32 OF
0, 1: Texts.WriteString(W, "(--CTR#0)&~CB")
| 2, 3: Texts.WriteString(W, "(--CTR=0)&~CB")
| 4..7: Texts.WriteString(W, "~CB")
| 8, 9: Texts.WriteString(W, "(--CTR#0)&~CB")
| 10, 11: Texts.WriteString(W, "(--CTR=0)&~CB")
| 12..15: Texts.WriteString(W, "CB")
| 16, 17, 24, 25: Texts.WriteString(W, "--CTR#0")
| 18, 19, 26, 27: Texts.WriteString(W, "--CTR=0")
| 20..23, 28..31: Texts.WriteString(W, "ALWAYS")
END
END BO;
PROCEDURE BT;
BEGIN WriteCB(curInstr DIV 2097152 MOD 32)
END BT;
PROCEDURE D;
BEGIN Texts.WriteInt(W, ASH(SYSTEM.LSH(curInstr MOD 65536, 16), -16), 0)
END D;
PROCEDURE FXM;
VAR s: SET; i: INTEGER; first: BOOLEAN;
BEGIN s := SYSTEM.VAL(SET, curInstr DIV 4096 MOD 256); first := TRUE; i := 24; Texts.WriteString(W, "CF[");
WHILE i < 32 DO
IF i IN s THEN
IF ~first THEN Texts.Write(W, ",") ELSE first := FALSE END;
Texts.WriteInt(W, i-24, 0)
END;
INC(i)
END;
Texts.Write(W, "]")
END FXM;
PROCEDURE FLM;
VAR s: SET; i: INTEGER; first: BOOLEAN;
BEGIN s := SYSTEM.VAL(SET, curInstr DIV 131072 MOD 256); first := TRUE; i := 24; Texts.WriteString(W, "FPSCR[");
WHILE i < 32 DO
IF i IN s THEN
IF ~first THEN Texts.Write(W, ",") ELSE first := FALSE END;
Texts.WriteInt(W, i-24, 0)
END;
INC(i)
END;
Texts.Write(W, "]")
END FLM;
PROCEDURE FRA;
BEGIN Texts.Write(W, "F"); Texts.WriteInt(W, curInstr DIV 65536 MOD 32, 0)
END FRA;
PROCEDURE FRB;
BEGIN Texts.Write(W, "F"); Texts.WriteInt(W, curInstr DIV 2048 MOD 32, 0)
END FRB;
PROCEDURE FRC;
BEGIN Texts.Write(W, "F"); Texts.WriteInt(W, curInstr DIV 64 MOD 32, 0)
END FRC;
PROCEDURE FRS;
BEGIN Texts.Write(W, "F"); Texts.WriteInt(W, curInstr DIV 2097152 MOD 32, 0)
END FRS;
PROCEDURE FRT;
BEGIN Texts.Write(W, "F"); Texts.WriteInt(W, curInstr DIV 2097152 MOD 32, 0)
END FRT;
PROCEDURE I;
VAR s: SET; i: INTEGER;
BEGIN
s := SYSTEM.VAL(SET, curInstr DIV 4096 MOD 16); i := 28;
WHILE i < 32 DO
IF i IN s THEN Texts.Write(W, "1") ELSE Texts.Write(W, "0") END;
INC(i)
END;
Texts.Write(W, "B")
END I;
PROCEDURE LI;
BEGIN
Texts.WriteHex(W, pc+ASH(SYSTEM.LSH(curInstr MOD 67108864 DIV 4, 8), -6)); Texts.Write(W, "H");
Texts.WriteString(W, " ["); Texts.WriteHex(W, -ASH(SYSTEM.LSH(curInstr MOD 67108864 DIV 4, 8), -6));
Texts.WriteString(W, "H]")
END LI;
PROCEDURE LK;
BEGIN IF curInstr MOD 2 = 1 THEN Texts.Write(W, "l") END
END LK;
PROCEDURE LKU;
BEGIN IF curInstr MOD 2 = 1 THEN Texts.Write(W, 9X); Texts.WriteString(W, "# invalidate LR") END
END LKU;
PROCEDURE MB;
BEGIN Texts.WriteInt(W, curInstr DIV 64 MOD 32, 0)
END MB;
PROCEDURE ME;
BEGIN Texts.WriteInt(W, curInstr DIV 2 MOD 32, 0)
END ME;
PROCEDURE NB;
BEGIN Texts.WriteInt(W, curInstr DIV 2048 MOD 32, 0)
END NB;
PROCEDURE OE;
BEGIN IF 21 IN SYSTEM.VAL(SET, curInstr) THEN Texts.Write(W, "o") END
END OE;
PROCEDURE RA;
BEGIN Texts.Write(W, "R"); Texts.WriteInt(W, curInstr DIV 65536 MOD 32, 0)
END RA;
PROCEDURE RB;
BEGIN Texts.Write(W, "R"); Texts.WriteInt(W, curInstr DIV 2048 MOD 32, 0)
END RB;
PROCEDURE RC;
BEGIN IF curInstr MOD 2 = 1 THEN Texts.Write(W, ".") END
END RC;
PROCEDURE RCU;
BEGIN IF curInstr MOD 2 = 1 THEN Texts.Write(W, 9X); Texts.WriteString(W, "# invalidate CR") END
END RCU;
PROCEDURE RS;
BEGIN Texts.Write(W, "R"); Texts.WriteInt(W, curInstr DIV 2097152 MOD 32, 0)
END RS;
PROCEDURE RT;
BEGIN Texts.Write(W, "R"); Texts.WriteInt(W, curInstr DIV 2097152 MOD 32, 0)
END RT;
PROCEDURE SH;
BEGIN Texts.WriteInt(W, curInstr DIV 2048 MOD 32, 0)
END SH;
PROCEDURE SI;
BEGIN Texts.WriteInt(W, ASH(SYSTEM.LSH(curInstr, 16), -16), 0)
END SI;
PROCEDURE SPR;
BEGIN
CASE curInstr DIV 65536 MOD 32 OF
0: Texts.WriteString(W, "MQ")
| 1: Texts.WriteString(W, "XER")
| 4: Texts.WriteString(W, "to RTCU")
| 5: Texts.WriteString(W, "to RTCL")
| 6: Texts.WriteString(W, "to DEC")
| 8: Texts.WriteString(W, "LR")
| 9: Texts.WriteString(W, "CTR")
| 17: Texts.WriteString(W, "TID")
| 18: Texts.WriteString(W, "DSISR")
| 19: Texts.WriteString(W, "DAR")
| 20: Texts.WriteString(W, "to RTCU")
| 21: Texts.WriteString(W, "to RTCL")
| 22: Texts.WriteString(W, "to DEC")
| 24: Texts.WriteString(W, "SDR0")
| 25: Texts.WriteString(W, "SDR1")
| 26: Texts.WriteString(W, "SRR0")
| 27: Texts.WriteString(W, "SRR1")
| 2, 3, 7, 10..16, 23, 28..31: Texts.WriteString(W, "INVALID")
END
END SPR;
PROCEDURE SR;
BEGIN Texts.Write(W, "S"); Texts.WriteInt(W, curInstr DIV 65536 MOD 16, 0)
END SR;
PROCEDURE TOf;
BEGIN
CASE curInstr DIV 2097152 MOD 32 OF
0: Texts.WriteString(W, "NEVER")
| 1: Texts.WriteString(W, ">u")
| 2: Texts.WriteString(W, "<u")
| 3, 11, 19, 24, 25, 26, 27: Texts.Write(W, "#")
| 4: Texts.Write(W, "=")
| 5: Texts.WriteString(W, ">=u")
| 6: Texts.WriteString(W, "<=u")
| 7, 15, 23, 28, 29, 30, 31: Texts.WriteString(W, "ALWAYS")
| 8: Texts.WriteString(W, ">s")
| 9: Texts.WriteString(W, ">s OR >u")
| 10: Texts.WriteString(W, ">s OR <u")
| 12: Texts.WriteString(W, ">=s")
| 13: Texts.WriteString(W, ">=s OR >u")
| 14: Texts.WriteString(W, ">=s OR <u")
| 16: Texts.WriteString(W, "<s")
| 17: Texts.WriteString(W, "<s OR >u")
| 18: Texts.WriteString(W, "<s OR <u")
| 20: Texts.WriteString(W, "<=s")
| 21: Texts.WriteString(W, "<=s OR >u")
| 22: Texts.WriteString(W, "<=s OR <u")
END
END TOf;
PROCEDURE UI;
BEGIN Texts.WriteHex(W, curInstr MOD 65536); Texts.Write(W, "H")
END UI;
PROCEDURE tab;
BEGIN Texts.Write(W, 9X)
END tab;
PROCEDURE comma;
BEGIN Texts.WriteString(W, ", ")
END comma;
PROCEDURE op;
BEGIN Texts.Write(W, "(")
END op;
PROCEDURE cp;
BEGIN Texts.Write(W, ")")
END cp;
BEGIN
Texts.WriteString(W, mnemonic);
CASE fields OF
LIxAAxLK: LK; AA; tab; LI
| BOxBIxBDxAAxLK: LK; AA; tab; BO; comma; BI; comma; BD
| BOxBIxLK: LK; tab; BO; comma; BI
| LKu: tab; LKU
| Rcu: tab; LKU
| None:
| BFxBFAxLKu: tab; BF; comma; BFA; LKU
| BTxBAxBBxLKu: tab; BT; comma; BA; comma; BB; LKU
| RTxDxRA: tab; RT; comma; D; op; RA; cp
| RSxDxRA: tab; RS; comma; D; op; RA; cp
| RSxRAxRBxRcu: tab; RS; comma; RA; comma; RB; RCU
| RTxRAxNBxRcu: tab; RT; comma; RA; comma; NB; RCU
| RSxRAxNBxRcu: tab; RS; comma; RA; comma; NB; RCU
| RTxRAxUI: tab; RT; comma; RA; comma; UI
| RTxRAxSI: tab; RT; comma; RA; comma; SI
| RTxRAxRBxRc: RC; tab; RT; comma; RA; comma; RB
| RTxRAxRBxRcu: tab; RT; comma; RA; comma; RB; RCU
| RTxRAxRc: RC; tab; RT; comma; RA
| RTxRAxRcu: tab; RT; comma; RA; RCU
| BFxRAxSI: tab; BF; comma; RA; comma; SI
| BFxRAxUI: tab; BF; comma; RA; comma; UI
| BFxRAxRBxRcu: tab; BF; comma; RA; comma; RB; RCU
| TOxRAxSI: tab; TOf; comma; RA; comma; SI
| TOxRAxRBxRcu: tab; TOf; comma; RA; comma; RB; RCU
| RAxRSxUI: tab; RA; comma; RS; comma; UI
| RAxRSxRBxRc: RC; tab; RA; comma; RS; comma; RB
| RAxRSxRc: RC; tab; RA; comma; RS
| RAxRSxSHxMBxMExRc: RC; tab; RA; comma; RS; comma; SH; comma; MB; comma; ME
| RAxRSxRBxMBxMExRc: RC; tab; RA; comma; RS; comma; RB; comma; MB; comma; ME
| RAxRSxSHxRc: RC; tab; RA; comma; RS; comma; SH
| SPRxRSxRcu: tab; SPR; comma; RS; RCU
| RTxSPRxRcu: tab; RT; comma; SPR; RCU
| FXMxRSxRcu: tab; FXM; comma; RS; RCU
| BFxRcu: tab; BF; RCU
| RTxRcu: tab; RT; RCU
| RSxRcu: tab; RS; RCU
| FRTxDxRA: tab; FRT; comma; D; op; RA; cp
| FRTxRAxRBxRcu: tab; FRT; comma; RA; comma; RB; RCU
| FRSxDxRA: tab; FRS; comma; D; op; RA; cp
| FRSxRAxRBxRcu: tab; FRS; comma; RA; comma; RB; RCU
| FRTxFRBxRc: RC; tab; FRT; comma; FRB
| FRTxFRAxFRBxRc: RC; tab; FRT; comma; FRA; comma; FRB
| FRTxFRAxFRCxRc: RC; tab; FRT; comma; FRA; comma; FRC
| FRTxFRAxFRCxFRBxRc: RC; tab; FRT; comma; FRA; comma; FRC; comma; FRB
| BFxFRAxFRBxRcu: tab; BF; comma; FRA; comma; FRB; RCU
| FRTxRc: RC; tab; FRT
| BFxBFAxRcu: tab; BF; comma; BFA; RCU
| FLMxFRBxRc: RC; tab; FLM; comma; FRB
| BFxIxRc: RC; tab; BF; comma; I
| BTxRc: RC; tab; BT
| RAxRBxRc: RC; tab; RA; comma; RB
| RAxRBxRcu: tab; RA; comma; RB; RCU
| SRxRSxRcu: tab; SR; comma; RS; RCU
| RTxSRxRcu: tab; RT; comma; SR; RCU
| RTxRA: tab; RT; comma; RA
| RTxSI: tab; RT; comma; SI
END;
END Instr;
PROCEDURE error;
BEGIN Texts.WriteString(W, "invalid instruction "); Texts.WriteHex(W, curInstr); Texts.Write(W, "H"); Texts.WriteLn(W)
END error;
PROCEDURE DecodeXL (instr: LONGINT);
VAR extOp: LONGINT;
BEGIN
extOp := ASH(instr MOD 2048, -1);
IF extOp <= 150 THEN
IF extOp <= 50 THEN
IF extOp <= 16 THEN
IF extOp = 0 THEN Instr("mcrf", BFxBFAxLKu) ELSIF extOp = 16 THEN Instr("bclr", BOxBIxLK)
ELSE error END
ELSE
IF extOp = 33 THEN Instr("crnor", BTxBAxBBxLKu) ELSIF extOp = 50 THEN Instr("rfi", LKu)
ELSE error END
END
ELSE
IF extOp <= 129 THEN
IF extOp = 82 THEN Instr("rfsvc", LKu) ELSIF extOp = 129 THEN Instr("crandc", BTxBAxBBxLKu)
ELSE error END
ELSE
IF extOp = 150 THEN Instr("isync", LKu) ELSE error END
END
END
ELSE
IF extOp <= 289 THEN
IF extOp <= 225 THEN
IF extOp = 193 THEN Instr("crxor", BTxBAxBBxLKu) ELSIF extOp = 225 THEN Instr("crnand", BTxBAxBBxLKu)
ELSE error END
ELSE
IF extOp = 257 THEN Instr("crand", BTxBAxBBxLKu) ELSIF extOp = 289 THEN Instr("creqv", BTxBAxBBxLKu)
ELSE error END
END
ELSE
IF extOp <= 449 THEN
IF extOp = 417 THEN Instr("crorc", BTxBAxBBxLKu) ELSIF extOp = 449 THEN Instr("cror", BTxBAxBBxLKu)
ELSE error END
ELSE
IF extOp = 528 THEN Instr("bcctr", BOxBIxLK) ELSE error END
END
END
END
END DecodeXL;
PROCEDURE DecodeX (instr: LONGINT);
VAR extOp: LONGINT; s: ARRAY 2 OF CHAR;
BEGIN
extOp := ASH(instr MOD 2048, -1);
IF extOp <= 467 THEN
IF extOp <= 200 THEN
IF extOp <= 87 THEN
IF extOp <= 26 THEN
IF extOp <= 10 THEN
IF extOp <= 4 THEN
IF extOp = 0 THEN Instr("cmp", BFxRAxRBxRcu)
ELSIF extOp = 4 THEN Instr("tw", TOxRAxRBxRcu)
ELSE error END
ELSE
IF extOp = 8 THEN Instr("subfc", RTxRAxRBxRc)
ELSIF extOp = 10 THEN Instr("addc", RTxRAxRBxRc)
ELSE error END
END
ELSE
IF extOp <= 23 THEN
IF extOp = 19 THEN Instr("mfcr", RTxRcu) ELSIF extOp = 23 THEN Instr("lwzx", RTxRAxRBxRcu)
ELSE error END
ELSE
IF extOp = 24 THEN Instr("slw", RAxRSxRBxRc) ELSIF extOp = 26 THEN Instr("cntlzw", RAxRSxRc)
ELSE error END
END
END
ELSE
IF extOp <= 55 THEN
IF extOp <= 29 THEN
IF extOp = 28 THEN Instr("and", RAxRSxRBxRc)
ELSIF extOp = 29 THEN Instr("maskg", RAxRSxRBxRc)
ELSE error END
ELSE
IF extOp = 32 THEN Instr("cmpl", BFxRAxRBxRcu) ELSIF extOp = 55 THEN Instr("lwzux", RTxRAxRBxRcu)
ELSE error END
END
ELSE
IF extOp <= 83 THEN
IF extOp = 60 THEN Instr("andc", RAxRSxRBxRc) ELSIF extOp = 83 THEN Instr("mfmsr", RTxRcu)
ELSE error END
ELSE
IF extOp = 87 THEN Instr("lbzx", RTxRAxRBxRcu) ELSE error END
END
END
END
ELSE
IF extOp <= 144 THEN
IF extOp <= 119 THEN
IF extOp <= 107 THEN
IF extOp = 104 THEN Instr("neg", RTxRAxRc) ELSIF extOp = 107 THEN Instr("mul", RTxRAxRBxRc)
ELSE error END
ELSE
IF extOp = 118 THEN Instr("clf", RAxRBxRcu) ELSIF extOp = 119 THEN Instr("lbzux", RTxRAxRBxRcu)
ELSE error END
END
ELSE
IF extOp <= 136 THEN
IF extOp = 124 THEN Instr("nor", RAxRSxRBxRc) ELSIF extOp = 136 THEN Instr("subfe", RTxRAxRBxRc)
ELSE error END
ELSE
IF extOp = 138 THEN Instr("adde", RTxRAxRBxRc) ELSIF extOp = 144 THEN Instr("mtcrf", FXMxRSxRcu)
ELSE error END
END
END
ELSE
IF extOp <= 153 THEN
IF extOp <= 151 THEN
IF extOp = 146 THEN Instr("mtmsr", RSxRcu) ELSIF extOp = 151 THEN Instr("stwx", RSxRAxRBxRcu)
ELSE error END
ELSE
IF extOp = 152 THEN Instr("slq", RAxRSxRBxRc) ELSIF extOp = 153 THEN Instr("sle", RAxRSxRBxRc)
ELSE error END
END
ELSE
IF extOp <= 184 THEN
IF extOp = 183 THEN Instr("stwux", RSxRAxRBxRcu)
ELSIF extOp = 184 THEN Instr("sliq", RAxRSxSHxRc)
ELSE error END
ELSE
IF extOp = 200 THEN Instr("subfze", RTxRAxRc) ELSE error END
END
END
END
END
ELSE
IF extOp <= 279 THEN
IF extOp <= 235 THEN
IF extOp <= 216 THEN
IF extOp <= 210 THEN
IF extOp = 202 THEN Instr("addze", RTxRAxRc) ELSIF extOp = 210 THEN Instr("mtsr", SRxRSxRcu)
ELSE error END
ELSE
IF extOp = 215 THEN Instr("stbx", RSxRAxRBxRcu)
ELSIF extOp = 216 THEN Instr("sllq", RAxRSxRBxRc)
ELSE error END
END
ELSE
IF extOp <= 232 THEN
IF extOp = 217 THEN Instr("sleq", RAxRSxRBxRc) ELSIF extOp = 232 THEN Instr("subfme", RTxRAxRc)
ELSE error END
ELSE
IF extOp = 234 THEN Instr("addme", RTxRAxRc) ELSIF extOp = 235 THEN Instr("mullw", RTxRAxRBxRc)
ELSE error END
END
END
ELSE
IF extOp <= 264 THEN
IF extOp <= 247 THEN
IF extOp = 242 THEN Instr("mtsrin", RSxRAxRBxRcu)
ELSIF extOp = 247 THEN Instr("stbux", RSxRAxRBxRcu)
ELSE error END
ELSE
IF extOp = 248 THEN Instr("slliq", RAxRSxSHxRc)
ELSIF extOp = 264 THEN Instr("doz", RTxRAxRBxRc)
ELSE error END
END
ELSE
IF extOp <= 277 THEN
IF extOp = 266 THEN Instr("add", RTxRAxRBxRc)
ELSIF extOp = 277 THEN Instr("lscbx", RTxRAxRBxRc)
ELSE error END
ELSE
IF extOp = 279 THEN Instr("lhzx", RTxRAxRBxRcu) ELSE error END
END
END
END
ELSE
IF extOp <= 360 THEN
IF extOp <= 316 THEN
IF extOp <= 306 THEN
IF extOp = 284 THEN Instr("eqv", RAxRSxRBxRc) ELSIF extOp = 306 THEN Instr("tlbie", RAxRBxRc)
ELSE error END
ELSE
IF extOp = 311 THEN Instr("lhzux", RTxRAxRBxRcu)
ELSIF extOp = 316 THEN Instr("xor", RAxRSxRBxRc)
ELSE error END
END
ELSE
IF extOp <= 339 THEN
IF extOp = 331 THEN Instr("div", RTxRAxRBxRc) ELSIF extOp = 339 THEN Instr("mfspr", RTxSPRxRcu)
ELSE error END
ELSE
IF extOp = 343 THEN Instr("lhax", RTxRAxRBxRcu) ELSIF extOp = 360 THEN Instr("abs", RTxRAxRc)
ELSE error END
END
END
ELSE
IF extOp <= 412 THEN
IF extOp <= 375 THEN
IF extOp = 363 THEN Instr("divs", RTxRAxRBxRc)
ELSIF extOp = 375 THEN Instr("lhaux", RTxRAxRBxRcu)
ELSE error END
ELSE
IF extOp = 407 THEN Instr("sthx", RSxRAxRBxRcu)
ELSIF extOp = 412 THEN Instr("orc", RAxRSxRBxRc)
ELSE error END
END
ELSE
IF extOp <= 444 THEN
IF extOp = 439 THEN Instr("sthux", RSxRAxRBxRcu)
ELSIF extOp = 444 THEN Instr("or", RAxRSxRBxRc)
ELSE error END
ELSE
IF extOp = 467 THEN Instr("mtspr", SPRxRSxRcu) ELSE error END
END
END
END
END
END
ELSE
IF extOp <= 665 THEN
IF extOp <= 595 THEN
IF extOp <= 533 THEN
IF extOp <= 512 THEN
IF extOp <= 488 THEN
IF extOp = 476 THEN Instr("nand", RAxRSxRBxRc) ELSIF extOp = 488 THEN Instr("nabs", RTxRAxRc)
ELSE error END
ELSE
IF extOp = 502 THEN Instr("cli", RAxRBxRcu) ELSIF extOp = 512 THEN Instr("mcrxr", BFxRcu)
ELSE error END
END
ELSE
IF extOp <= 522 THEN
IF extOp = 520 THEN Instr("subfco", RTxRAxRBxRc) ELSIF extOp = 522 THEN Instr("addco", RTxRAxRBxRc)
ELSE error END
ELSE
IF extOp = 531 THEN Instr("clcs", RTxRAxRcu) ELSIF extOp = 533 THEN Instr("lswx", RTxRAxRBxRcu)
ELSE error END
END
END
ELSE
IF extOp <= 537 THEN
IF extOp <= 535 THEN
IF extOp = 534 THEN Instr("lwbrx", RTxRAxRBxRcu)
ELSIF extOp = 535 THEN Instr("lfsx", FRTxRAxRBxRcu)
ELSE error END
ELSE
IF extOp = 536 THEN Instr("srw", RAxRSxRBxRc) ELSIF extOp = 537 THEN Instr("rrib", RAxRSxRBxRc)
ELSE error END
END
ELSE
IF extOp <= 567 THEN
IF extOp = 541 THEN Instr("maskir", RAxRSxRBxRc)
ELSIF extOp = 567 THEN Instr("lfsux", FRTxRAxRBxRcu)
ELSE error END
ELSE
IF extOp = 595 THEN Instr("mfsr", RTxSRxRcu) ELSE error END
END
END
END
ELSE
IF extOp <= 631 THEN
IF extOp <= 616 THEN
IF extOp <= 598 THEN
IF extOp = 597 THEN Instr("lswi", RTxRAxNBxRcu) ELSIF extOp = 598 THEN Instr("sync", Rcu)
ELSE error END
ELSE
IF extOp = 599 THEN Instr("lfdx", FRTxRAxRBxRcu)
ELSIF extOp = 616 THEN Instr("nego", RTxRAxRc)
ELSE error END
END
ELSE
IF extOp <= 627 THEN
IF extOp = 619 THEN Instr("mulo", RTxRAxRBxRc)
ELSIF extOp = 627 THEN Instr("mfsri", RTxRAxRBxRcu)
ELSE error END
ELSE
IF extOp = 630 THEN Instr("dclst", RAxRBxRcu)
ELSIF extOp = 631 THEN Instr("lfdux", FRTxRAxRBxRcu)
ELSE error END
END
END
ELSE
IF extOp <= 662 THEN
IF extOp <= 650 THEN
IF extOp = 648 THEN Instr("subfeo", RTxRAxRBxRc)
ELSIF extOp = 650 THEN Instr("addeo", RTxRAxRBxRc)
ELSE error END
ELSE
IF extOp = 661 THEN Instr("stswx", RSxRAxRBxRcu)
ELSIF extOp = 662 THEN Instr("stwbrx", RSxRAxRBxRcu)
ELSE error END
END
ELSE
IF extOp <= 664 THEN
IF extOp = 663 THEN Instr("stfsx", FRSxRAxRBxRcu)
ELSIF extOp = 664 THEN Instr("srq", RAxRSxRBxRc)
ELSE error END
ELSE
IF extOp = 665 THEN Instr("sre", RAxRSxRBxRc) ELSE error END
END
END
END
END
ELSE
IF extOp <= 778 THEN
IF extOp <= 729 THEN
IF extOp <= 714 THEN
IF extOp <= 696 THEN
IF extOp = 695 THEN Instr("stfsux", FRSxRAxRBxRcu)
ELSIF extOp = 696 THEN Instr("sriq", RAxRSxSHxRc)
ELSE error END
ELSE
IF extOp = 712 THEN Instr("subfzeo", RTxRAxRc) ELSIF extOp = 714 THEN Instr("addzeo", RTxRAxRc)
ELSE error END
END
ELSE
IF extOp <= 727 THEN
IF extOp = 725 THEN Instr("stswi", RSxRAxNBxRcu)
ELSIF extOp = 727 THEN Instr("stfdx", FRSxRAxRBxRcu)
ELSE error END
ELSE
IF extOp = 728 THEN Instr("srlq", RAxRSxRBxRc)
ELSIF extOp = 729 THEN Instr("sreq", RAxRSxRBxRc)
ELSE error END
END
END
ELSE
IF extOp <= 759 THEN
IF extOp <= 746 THEN
IF extOp = 744 THEN Instr("subfmeo", RTxRAxRc) ELSIF extOp = 746 THEN Instr("addmeo", RTxRAxRc)
ELSE error END
ELSE
IF extOp = 747 THEN Instr("mullwo", RTxRAxRBxRc)
ELSIF extOp = 759 THEN Instr("stfdux", FRSxRAxRBxRcu)
ELSE error END
END
ELSE
IF extOp <= 776 THEN
IF extOp = 760 THEN Instr("srliq", RAxRSxSHxRc)
ELSIF extOp = 776 THEN Instr("dozo", RTxRAxRBxRc)
ELSE error END
ELSE
IF extOp = 778 THEN Instr("addo", RTxRAxRBxRc) ELSE error END
END
END
END
ELSE
IF extOp <= 875 THEN
IF extOp <= 824 THEN
IF extOp <= 792 THEN
IF extOp = 790 THEN Instr("lhbrx", RTxRAxRBxRcu)
ELSIF extOp = 792 THEN Instr("sraw", RAxRSxRBxRc)
ELSE error END
ELSE
IF extOp = 818 THEN Instr("rac", RTxRAxRBxRc) ELSIF extOp = 824 THEN Instr("srawi", RAxRSxSHxRc)
ELSE error END
END
ELSE
IF extOp <= 872 THEN
IF extOp = 843 THEN Instr("divo", RTxRAxRBxRc) ELSIF extOp = 872 THEN Instr("abso", RTxRAxRc)
ELSE error END
ELSE
IF extOp = 875 THEN Instr("divso", RTxRAxRBxRc) ELSE error END
END
END
ELSE
IF extOp <= 921 THEN
IF extOp <= 918 THEN
IF extOp = 900 THEN Instr("nabso", RTxRAxRc)
ELSIF extOp = 918 THEN Instr("sthbrx", RSxRAxRBxRcu)
ELSE error END
ELSE
IF extOp = 920 THEN Instr("sraq", RAxRSxRBxRc)
ELSIF extOp = 921 THEN Instr("srea", RAxRSxRBxRc)
ELSE error END
END
ELSE
IF extOp <= 952 THEN
IF extOp = 922 THEN Instr("extsh", RAxRSxRc) ELSIF extOp = 952 THEN Instr("sraiq", RAxRSxSHxRc)
ELSE error END
ELSE
IF extOp = 954 THEN Instr("extsb", RAxRSxRc) ELSIF extOp = 1014 THEN Instr("dcbz", RAxRBxRcu) ELSE error END
END
END
END
END
END
END
END DecodeX;
PROCEDURE DecodeX2 (instr: LONGINT);
VAR extOp: LONGINT;
BEGIN
extOp := ASH(instr MOD 128, -1); (* for A-form instructions *)
IF (extOp < 32) & (extOp IN {18, 20, 21, 25, 28, 29, 30, 31}) THEN
CASE extOp OF
18: Instr("fdiv", FRTxFRAxFRBxRc)
| 20: Instr("fsub", FRTxFRAxFRBxRc)
| 21: Instr("fadd", FRTxFRAxFRBxRc)
| 25: Instr("fmul", FRTxFRAxFRCxRc)
| 28: Instr("fmsub", FRTxFRAxFRCxFRBxRc)
| 29: Instr("fmadd", FRTxFRAxFRCxFRBxRc)
| 30: Instr("fnmsub", FRTxFRAxFRCxFRBxRc)
| 31: Instr("fnmadd", FRTxFRAxFRCxFRBxRc)
END
ELSE extOp := ASH(instr MOD 2048, -1); (* for X-form instructions *)
IF extOp <= 70 THEN
IF extOp <= 38 THEN
IF extOp <= 12 THEN
IF extOp = 0 THEN Instr("fcmpu", BFxFRAxFRBxRcu) ELSIF extOp = 12 THEN Instr("frsp", FRTxFRBxRc)
ELSE error END
ELSE
IF extOp = 32 THEN Instr("fcmpo", BFxFRAxFRBxRcu) ELSIF extOp = 38 THEN Instr("mtfsb1", BTxRc)
ELSE error END
END
ELSE
IF extOp <= 64 THEN
IF extOp = 40 THEN Instr("fneg", FRTxFRBxRc) ELSIF extOp = 64 THEN Instr("mcrfs", BFxBFAxRcu)
ELSE error END
ELSE
IF extOp = 70 THEN Instr("mtfsb0", BTxRc) ELSE error END
END
END
ELSE
IF extOp <= 136 THEN
IF extOp <= 134 THEN
IF extOp = 72 THEN Instr("fmr", FRTxFRBxRc) ELSIF extOp = 134 THEN Instr("mtfsfi", BFxIxRc)
ELSE error END
ELSE
IF extOp = 136 THEN Instr("fnabs", FRTxFRBxRc) ELSE error END
END
ELSE
IF extOp <= 583 THEN
IF extOp = 264 THEN Instr("fabs", FRTxFRBxRc) ELSIF extOp = 583 THEN Instr("mffs", FRTxRc)
ELSE error END
ELSE
IF extOp = 711 THEN Instr("mtfsf", FLMxFRBxRc) ELSE error END
END
END
END
END
END DecodeX2;
PROCEDURE DecodeInstr (instr: LONGINT);
VAR pOpcode: LONGINT; s: ARRAY 2 OF CHAR;
BEGIN curInstr := instr;
pOpcode := SYSTEM.LSH(instr, -26);
CASE pOpcode OF
3: Instr("twi", TOxRAxSI)
| 7: Instr("mulli", RTxRAxSI)
| 8: Instr("subfic", RTxRAxSI)
| 9: Instr("dozi", RTxRAxSI)
| 10: Instr("cmpli", BFxRAxUI)
| 11: Instr("cmpi", BFxRAxSI)
| 12: Instr("addic", RTxRAxSI)
| 13: Instr("addic.", RTxRAxSI)
| 14:
IF instr DIV 65536 MOD 32 = 0 THEN Instr("li", RTxSI)
ELSIF instr MOD 65536 = 0 THEN Instr("lr", RTxRA)
ELSE Instr("addi", RTxDxRA)
END
| 15: Instr("addis", RTxRAxUI)
| 16: Instr("bc", BOxBIxBDxAAxLK)
| 17: Instr("svc", None) (* special handling to be added later *)
| 18: s[0] := "b"; s[1] := 0X; Instr(s, LIxAAxLK)
| 19: DecodeXL(instr)
| 20: Instr("rlwimi", RAxRSxSHxMBxMExRc)
| 21: Instr("rlwinm", RAxRSxSHxMBxMExRc)
| 22: Instr("rlmi", RAxRSxSHxMBxMExRc)
| 23: Instr("rlwnm", RAxRSxRBxMBxMExRc)
| 24: Instr("ori", RAxRSxUI)
| 25: Instr("oris", RAxRSxUI)
| 26: Instr("xori", RAxRSxUI)
| 27: Instr("xoris", RAxRSxUI)
| 28: Instr("andi.", RAxRSxUI)
| 29: Instr("andis.", RAxRSxUI)
| 31: DecodeX(instr)
| 32: Instr("lwz", RTxDxRA)
| 33: Instr("lwzu", RTxDxRA)
| 34: Instr("lbz", RTxDxRA)
| 35: Instr("lbzu", RTxDxRA)
| 36: Instr("stw", RSxDxRA)
| 37: Instr("stwu", RSxDxRA)
| 38: Instr("stb", RSxDxRA)
| 39: Instr("stbu", RSxDxRA)
| 40: Instr("lhz", RTxDxRA)
| 41: Instr("lhzu", RTxDxRA)
| 42: Instr("lha", RTxDxRA)
| 43: Instr("lhau", RTxDxRA)
| 44: Instr("sth", RSxDxRA)
| 45: Instr("sthu", RSxDxRA)
| 46: Instr("lmw", RTxDxRA)
| 47: Instr("stmw", RSxDxRA)
| 48: Instr("lfs", FRTxDxRA)
| 49: Instr("lfsu", FRTxDxRA)
| 50: Instr("lfd", FRTxDxRA)
| 51: Instr("lfdu", FRTxDxRA)
| 52: Instr("stfs", FRSxDxRA)
| 53: Instr("stfsu", FRSxDxRA)
| 54: Instr("stfd", FRSxDxRA)
| 55: Instr("stfdu", FRSxDxRA)
| 59: (* PowerPC single precision FP *)
CASE ASH(instr MOD 64, -1) OF
18: Instr("fdivs", FRTxFRAxFRBxRc)
| 20: Instr("fsubs", FRTxFRAxFRBxRc)
| 21: Instr("fadds", FRTxFRAxFRBxRc)
| 25: Instr("fmuls", FRTxFRAxFRCxRc)
| 28: Instr("fmsubs", FRTxFRAxFRCxFRBxRc)
| 29: Instr("fmadds", FRTxFRAxFRCxFRBxRc)
| 30: Instr("fnmsubs", FRTxFRAxFRCxFRBxRc)
| 31: Instr("fnmadds", FRTxFRAxFRCxFRBxRc)
ELSE
END
| 63: DecodeX2(instr)
| 0: error
ELSE error
END
END DecodeInstr;
PROCEDURE DumpInt (VAR R: Files.Rider; comment: ARRAY OF CHAR);
VAR i: INTEGER;
BEGIN
ReadInt(R, i); Texts.Write(W, tab); Texts.WriteString(W, comment);
Texts.WriteString(W, ": "); Texts.WriteInt(W, i, 0); Texts.WriteLn(W)
END DumpInt;
PROCEDURE DumpIntS (VAR R: Files.Rider; comment: ARRAY OF CHAR; VAR i: INTEGER);
BEGIN
ReadInt(R, i); Texts.Write(W, tab); Texts.WriteString(W, comment);
Texts.WriteString(W, ": "); Texts.WriteInt(W, i, 0); Texts.WriteLn(W)
END DumpIntS;
PROCEDURE DumpLongInt (VAR R: Files.Rider; comment: ARRAY OF CHAR);
VAR i: LONGINT;
BEGIN
ReadLInt(R, i); Texts.Write(W, tab); Texts.WriteString(W, comment);
Texts.WriteString(W, ": "); Texts.WriteInt(W, i, 0); Texts.WriteLn(W);
END DumpLongInt;
PROCEDURE DumpHex (VAR R: Files.Rider; comment: ARRAY OF CHAR);
VAR i: LONGINT;
BEGIN
ReadLInt(R, i); Texts.Write(W, tab); Texts.WriteString(W, comment);
Texts.WriteString(W, ": "); Texts.WriteHex(W, i); Texts.Write(W, "H"); Texts.WriteLn(W)
END DumpHex;
PROCEDURE WriteName (VAR R: Files.Rider);
VAR s: ARRAY 64 OF CHAR; ch: CHAR; i: INTEGER;
BEGIN
i := 0; REPEAT Files.Read(R, ch); s[i] := ch; INC(i) UNTIL ch = 0X;
Texts.WriteString(W, s)
END WriteName;
PROCEDURE WriteInt (VAR R: Files.Rider);
VAR i: INTEGER;
BEGIN
ReadInt(R, i); Texts.WriteInt(W, i, 0)
END WriteInt;
PROCEDURE WriteLongInt (VAR R: Files.Rider);
VAR i: LONGINT;
BEGIN
ReadLInt(R, i); Texts.WriteInt(W, i, 0)
END WriteLongInt;
PROCEDURE WriteHex (VAR R: Files.Rider);
VAR i: INTEGER;
BEGIN
ReadInt(R, i); Texts.WriteHex(W, i)
END WriteHex;
PROCEDURE WriteLongHex (VAR R: Files.Rider);
VAR i: LONGINT;
BEGIN
ReadLInt(R, i); Texts.WriteHex(W, i)
END WriteLongHex;
PROCEDURE DumpName (VAR R: Files.Rider; comment: ARRAY OF CHAR);
VAR s: ARRAY 64 OF CHAR; ch: CHAR; i: INTEGER;
BEGIN
i := 0; REPEAT Files.Read(R, ch); s[i] := ch; INC(i) UNTIL ch = 0X;
Texts.Write(W, tab); Texts.WriteString(W, comment); Texts.WriteString(W, ": ");
Texts.WriteString(W, s); Texts.WriteLn(W)
END DumpName;
PROCEDURE ReadCompInt (VAR R: Files.Rider; VAR i: LONGINT);
VAR n: LONGINT; s: SHORTINT; x: CHAR;
BEGIN s := 0; n := 0; Files.Read(R, x);
WHILE ORD(x) >= 128 DO INC(n, ASH(ORD(x) - 128, s)); INC(s, 7); Files.Read(R, x) END;
i := n + ASH(ORD(x) MOD 64 - ORD(x) DIV 64 * 64, s)
END ReadCompInt;
PROCEDURE OverReadTypes (VAR r: Files.Rider); (* MK *)
VAR n: LONGINT; ch: CHAR;
BEGIN
Files.Read (r, ch);
IF ch = CHR (ProcTyp) THEN ReadCompInt (r, n)
ELSIF ch = 0FX THEN ReadCompInt (r, n); ReadCompInt (r, n); OverReadTypes (r)
ELSIF ch = 10X THEN Files.Read (r, ch); ReadCompInt (r, n)
ELSIF ch = 11X THEN ReadCompInt (r, n); OverReadTypes (r)
ELSIF ch = CHR (Pointer) THEN OverReadTypes (r)
END;
END OverReadTypes;
PROCEDURE DumpRefs (VAR R: Files.Rider; VAR nextProc: LONGINT);
VAR ch: CHAR; fsize, psize, ralloc, calloc, falloc: LONGINT; leaf: BOOLEAN;
BEGIN
ReadCompInt(R, nextProc); nextProc := nextProc*4;
IF nextProc # 0 THEN (* fix, if there are no references *)
Texts.WriteLn(W); Texts.WriteString(W, "PROCEDURE ");
ReadCompInt(R, fsize); ReadCompInt(R, psize); ReadCompInt(R, ralloc);
ReadCompInt(R, falloc); ReadCompInt(R, calloc); Files.Read(R, SYSTEM.VAL(SYSTEM.BYTE, leaf));
Files.Read(R, ch);
REPEAT Texts.Write(W, ch); Files.Read(R, ch) UNTIL ch = 0X;
Files.Read(R, ch);
WHILE (ch # 0F8X) & ~R.eof DO (* MK extended reference info *)
Files.Read(R, ch);
REPEAT Files.Read(R, ch) UNTIL ch = 0X;
ReadCompInt(R, fsize);
OverReadTypes (R);
Files.Read (R, ch)
END;
Texts.WriteString(W, ": fsize = "); Texts.WriteInt(W, fsize, 0);
Texts.WriteString(W, ", psize = "); Texts.WriteInt(W, psize, 0);
Texts.WriteString(W, ", ralloc = "); Texts.WriteInt(W, ralloc, 0);
Texts.WriteString(W, ", falloc = "); Texts.WriteInt(W, falloc, 0);
Texts.WriteString(W, ", calloc = "); Texts.WriteInt(W, calloc, 0);
IF leaf THEN Texts.WriteString(W, ", LEAF") ELSE Texts.WriteString(W, ", NON-LEAF") END;
Texts.WriteLn(W)
END
END DumpRefs;
PROCEDURE Decode*;
VAR
f: Files.File; R, Ref: Files.Rider; S: Texts.Scanner; text, wtext: Texts.Text; v: Viewers.Viewer;
i, pos, codesize, datasize, lastProc: LONGINT;
x, y, entno, nofcom, nofrec, nofptrs, nofGmod, noflk, code, const, noftraps: INTEGER; ch: CHAR;
invRef: BOOLEAN;
nofmth, nofnewmth, nofinhmth: INTEGER;
name: ARRAY 64 OF CHAR;
BEGIN
Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S); f := NIL;
IF (S.class = Texts.Char) & (S.c = "^") THEN
Oberon.GetSelection(text, pos, codesize, datasize);
IF datasize > 0 THEN Texts.OpenScanner(S, text, pos); Texts.Scan(S) END
END;
IF S.class = Texts.Name THEN
i := 0;
WHILE (S.s[i] # 0X) & (S.s[i] # ".") DO INC(i) END;
IF S.s[i] = 0X THEN S.s[i] := "." END;
S.s[i+1] := "O"; S.s[i+2] := "b"; S.s[i+3] := "j"; S.s[i+4] := 0X;
f := Files.Old(S.s);
wtext := TextFrames.Text("");
IF f # NIL THEN
Oberon.AllocateUserViewer(Oberon.Mouse.X, x, y);
COPY(S.s, name);
i := 0; WHILE name[i] # 0X DO INC(i) END;
name[i] := "."; name[i+1] := "D"; name[i+2] := "e"; name[i+3] := "c"; name[i+4] := 0X;
v := MenuViewers.New(
TextFrames.NewMenu(name, "System.Close System.Copy System.Grow Edit.Search Edit.Store "),
TextFrames.NewText(wtext, 0), TextFrames.menuH, x, y);
Files.Set(R, f, 0); pc := 0; Files.Read(R, ch);
(* header *)
IF ch = 0F8X THEN
Texts.WriteString(W, "HEADER "); Files.Read(R, ch); Texts.Write(W, ch); Texts.WriteLn(W);
ReadLInt(R, i); i := Files.Length(f)-i-1; Files.Set(Ref, f, i);
Files.Read(Ref, ch); invRef := ch # 8BX;
IF invRef THEN Texts.WriteString(W, "invalid REFERENCES"); Texts.WriteLn(W) END;
Files.Read(Ref, ch);
DumpIntS(R, "Entries", entno); DumpIntS(R, "Commands", nofcom);
DumpIntS(R, "Pointers", nofptrs); DumpIntS(R, "Records", nofrec); DumpIntS(R, "Modules", nofGmod);
DumpInt(R, "Linktable"); DumpIntS(R, "Links", noflk);
DumpLongInt(R, "Datasize"); DumpIntS(R, "Constsize", const); DumpIntS(R, "Codesize (words)", code);
DumpIntS(R, "Traps", noftraps);
DumpHex(R, "Key"); DumpName(R, "Modulename"); Files.Read(R, ch)
ELSE
Texts.WriteString(W, "invalid HEADER"); Texts.WriteLn(W);
WHILE (ch # 82X) & ~R.eof DO Files.Read(R, ch) END
END;
Texts.WriteLn(W);
(* entry block *)
IF ch = 82X THEN
Texts.WriteString(W, "ENTRY"); Texts.WriteLn(W); i := 0;
WHILE i < entno DO
Texts.Write(W, tab); Texts.WriteInt(W, i, 0); Texts.WriteString(W, ": ");
ReadInt(R, x); Texts.WriteHex(W, LONG(x)*4); Texts.Write(W, "H");
Texts.WriteLn(W); INC(i)
END;
Files.Read(R, ch)
ELSE
Texts.WriteString(W, "invalid ENTRY"); Texts.WriteLn(W);
WHILE (ch # 83X) & ~R.eof DO Files.Read(R, ch) END
END;
Texts.WriteLn(W);
(* command block *)
IF ch = 83X THEN
Texts.WriteString(W, "COMMAND"); Texts.WriteLn(W); i := 0;
WHILE i < nofcom DO
Texts.Write(W, tab); WriteName(R); Texts.WriteString(W, ": "); ReadInt(R, x);
Texts.WriteHex(W, LONG(x)*4); Texts.Write(W, "H");
Texts.WriteLn(W); INC(i)
END;
Files.Read(R, ch)
ELSE
Texts.WriteString(W, "invalid COMMAND"); Texts.WriteLn(W);
WHILE (ch # 84X) & ~R.eof DO Files.Read(R, ch) END
END;
Texts.WriteLn(W);
(* pointer block *)
IF ch = 84X THEN
Texts.WriteString(W, "POINTERS"); i := 0;
WHILE i < nofptrs DO
IF i MOD 8 = 0 THEN Texts.WriteLn(W); Texts.Write(W, tab) END;
WriteLongInt(R); Texts.Write(W, " "); INC(i)
END;
Texts.WriteLn(W); Files.Read(R, ch)
ELSE
Texts.WriteString(W, "invalid POINTERS"); Texts.WriteLn(W);
WHILE (ch # 85X) & ~R.eof DO Files.Read(R, ch) END
END;
Texts.WriteLn(W);
(* import block *)
IF ch = 85X THEN
Texts.WriteString(W, "IMPORT"); Texts.WriteLn(W); i := 0;
WHILE i < nofGmod DO
Texts.Write(W, tab); WriteLongHex(R); Texts.WriteString(W, "H "); WriteName(R);
Texts.WriteLn(W); INC(i)
END;
Files.Read(R, ch)
ELSE
Texts.WriteString(W, "invalid IMPORT"); Texts.WriteLn(W);
WHILE (ch # 86X) & ~R.eof DO Files.Read(R, ch) END
END;
Texts.WriteLn(W);
(* link entries *)
IF ch = 86X THEN
Texts.WriteString(W, "LINKS"); Texts.WriteLn(W); i := 0;
WHILE i < noflk DO
Texts.Write(W, tab); Files.Read(R, ch); Texts.Write(W, "("); Texts.WriteInt(W, ORD(ch), 0);
Files.Read(R, ch); Texts.Write(W, ","); Texts.WriteInt(W, ORD(ch), 0); Texts.WriteString(W, "): ");
ReadInt(R, x); x := -x; Texts.WriteHex(W, LONG(x)*4); Texts.Write(W, "H");
Texts.WriteLn(W); INC(i)
END;
Files.Read(R, ch)
ELSE
Texts.WriteString(W, "invalid LINKS"); Texts.WriteLn(W);
WHILE (ch # 87X) & ~R.eof DO Files.Read(R, ch) END
END;
Texts.WriteLn(W);
(* const block *)
IF ch = 87X THEN
Texts.WriteString(W, "CONST (not dumped)"); Files.Set(R, f, Files.Pos(R)+const); Texts.WriteLn(W)
ELSE Texts.WriteString(W, "invalid CONST"); Texts.WriteLn(W)
END;
Texts.WriteLn(W);
WHILE (ch # 88X) & ~R.eof DO Files.Read(R, ch) END;
(* code block *)
IF ch = 88X THEN
Texts.WriteString(W, "CODE"); Texts.WriteLn(W); pc := 0; lastProc := 0;
WHILE pc < LONG(code)*4 DO
IF (pc >= lastProc) & ~invRef THEN DumpRefs(Ref, lastProc) END;
ReadLInt(R, i);
Texts.Write(W, tab); Texts.WriteHex(W, pc); Texts.Write(W, tab); Texts.Write(W, tab);
Texts.WriteHex(W, i); Texts.Write(W, "H"); Texts.Write(W, tab); DecodeInstr(i); Texts.WriteLn(W);
INC(pc, 4)
END;
Texts.WriteLn(W); Files.Read(R, ch)
ELSE
Texts.WriteString(W, "invalid CODE"); Texts.WriteLn(W);
WHILE (ch # 89X) & ~R.eof DO Files.Read(R, ch) END
END;
Texts.WriteLn(W);
(* type descriptors *)
IF ch = 89X THEN
Texts.WriteString(W, "TYPES"); Texts.WriteLn(W); i := 0;
WHILE i < nofrec DO
Texts.Write(W, tab); Texts.WriteString(W, "size="); WriteLongInt(R);
Texts.WriteString(W, ", addr="); WriteInt(R);
Texts.WriteString(W, ", base=("); WriteInt(R); Texts.Write(W,","); WriteInt(R); Texts.Write(W, ")");
Files.ReadBytes(R, nofmth, 2); Files.ReadBytes(R, nofinhmth, 2); Files.ReadBytes(R, nofnewmth, 2);
Files.ReadBytes(R, nofptrs, 2);
Texts.WriteLn(W); Texts.Write(W, tab); Texts.WriteString(W, "name="); WriteName(R);
Texts.WriteLn(W); Texts.Write(W, tab); Texts.WriteInt(W, nofmth, 0);
Texts.WriteString(W, " methods, "); Texts.WriteInt(W, nofinhmth, 0);
Texts.WriteString(W, " inherited, new=(");
x := 0;
WHILE x < nofnewmth DO
WriteInt(R); Texts.Write(W, ":"); WriteInt(R); Texts.Write(W, " "); INC(x)
END;
Texts.Write(W, ")"); Texts.WriteLn(W); Texts.Write(W, tab); Texts.WriteString(W, "ptrtab=");
x := 0;
WHILE x < nofptrs DO
IF x MOD 8 = 7 THEN Texts.WriteLn(W); Texts.Write(W, tab) END;
WriteLongInt(R); Texts.Write(W, " "); INC(x)
END;
Texts.WriteLn(W); INC(i)
END;
Texts.WriteLn(W); Files.Read(R, ch)
ELSE
Texts.WriteString(W, "invalid TYPES"); Texts.WriteLn(W);
WHILE (ch # 8AX) & ~R.eof DO Files.Read(R, ch) END
END;
Texts.WriteLn(W);
IF ch = 8AX THEN
Texts.WriteString(W, "TRAPS"); Texts.WriteLn(W); i := 0;
WHILE i < noftraps DO
Texts.Write(W, tab); ReadInt(R, x); Texts.WriteHex(W, LONG(x)*4);
Texts.WriteString(W, "H: "); WriteInt(R); Texts.WriteLn(W); INC(i)
END;
Texts.WriteLn(W)
ELSE
Texts.WriteString(W, "invalid TRAPS"); Texts.WriteLn(W)
END
ELSE
Texts.WriteString(W, S.s); Texts.WriteString(W, " not found"); Texts.WriteLn(W)
END;
Texts.Append(wtext, W.buf)
END
END Decode;
BEGIN Texts.OpenWriter(W)
END Decoder.Decode ^